#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = '汤小洋'

'''
装饰器decorator：在代码运行期间为函数动态增加功能的一种方式，称为装饰器
作用：在不修改原函数的情况下为其添加新的功能，对函数进行扩展。类似于AOP

装饰器本质上就是一个函数，但有以下特点：
    1.接收一个函数作为参数，即是一个高阶函数
    2.返回一个函数，用该函数替代接收的函数，称为装饰函数
'''


# 定义一个装饰器，为函数添加打印日志的功能
def log(fn):
    def wrapper(*args, **kwargs):
        print(f'函数{fn.__name__}开始执行。。。')  # 函数对象的__name__属性用来获取函数名
        res = fn(*args, **kwargs)
        print(f'函数{fn.__name__}执行结束。。。')
        return res

    return wrapper  # 返回装饰函数


# 在函数的上面标注 @装饰器
@log
def f1(lst):
    for i in lst:
        if i % 2 == 0:
            print(i)


@log
def f2(num1, num2):
    sum = num1 + num2
    return sum


# 调用函数时实际上执行的是装饰函数
f1([12, 5, 34, 2, 7])
print(f2(3, 5))
